home *** CD-ROM | disk | FTP | other *** search
- ///--------------------------------------------------------------------------------------
- // Illustration.c
- //
- // By Vern Jensen, January 1996
- ///--------------------------------------------------------------------------------------
-
-
- #include <SWIncludes.h>
- #include <SWGameUtils.h>
-
- #include "SWApplication.h"
- #include "Illustration.h"
-
-
- #define kMaxFPS 30 // set to 0 for maximum speed
- #define kSpriteMoveDelta 5 // speed of the sprite you control
- #define kStartRow 1 // starting location of your sprite
- #define kStartCol 1
-
- #define kDiamondFrameRate 10 // How often diamond tiles change frames
-
- #define kNumIdleSprites 4
- #define kNumBallSprites 80
- #define kMaxSpriteMoveDelta 2
-
- #define kTileWidth 40
- #define kTileHeight 40
- #define kTileMapRows 36
- #define kTileMapCols 32
-
- #define kFollowSpriteMargin 0 // Distance sprite can get to edge of screen
-
-
- #define kLeftArrowKey 0x7B
- #define kRightArrowKey 0x7C
- #define kDownArrowKey 0x7D
- #define kUpArrowKey 0x7E
-
- #define kLeftKeyPad 0x56
- #define kRightKeyPad 0x58
- #define kDownKeyPad 0x54
- #define kUpKeyPad 0x5B
-
- #define kEscKey 0x35
-
-
- enum tileIDs
- {
- kGrassTile,
- kWallTile,
- kBlackTile,
- kDiamondTile,
- kDiamondTile2,
- kLastDiamondTile,
- kMaxNumTiles
- };
-
-
- /***********/
- /* Globals */
- /***********/
-
- SpriteWorldPtr gSpriteWorldP;
- FramePtr gMyWindowFrameP; // WindowFrameP for the bottom area of the screen
- TileMapStructPtr gTileMapStructP;
- TileMapPtr gTileMap;
- SpritePtr gSimpleSpriteP;
- WindowPtr gWindowP;
- Rect gOffscreenRect, gScreenRect, gMoveBoundsRect;
- short gPenSize = 1;
-
- struct moveKeys // Keeps track of which keys are up and which are down
- {
- Boolean up;
- Boolean right;
- Boolean down;
- Boolean left;
- } keys;
-
-
- // Below is our "hard-coded" maze data. Not the best way to store TileMap data,
- // but this was done before I made the SWSaveTileMap and SWLoadTileMap routines.
- // I decided to leave it this way to demonstrate how to load a "hard-coded" TileMap.
- short gMazeData[kTileMapRows][kTileMapCols] = {
- {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, // 0
- {1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,1}, // 1
- {1,0,0,0,0,0,0,0,1,0,1,0,0,0,1,1,1,1,1,0,0,0,1,0,0,1,1,1,1,1,0,1}, // 2
- {1,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,0,0,1,1,1,0,1,0,1,1,1,3,0,1,0,1}, // 3
- {1,1,1,1,1,1,0,1,1,0,1,0,0,0,0,0,1,0,1,1,3,0,1,0,0,0,1,1,0,1,0,1}, // 4
- {1,1,3,1,0,0,0,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,0,1,0,1,1,0,1,0,1}, // 5
- {1,0,0,1,0,1,0,1,1,1,1,0,0,1,3,0,1,1,0,0,0,1,0,0,1,0,0,0,0,1,0,1}, // 6
- {1,0,1,1,0,1,0,0,1,0,0,0,1,1,1,0,0,1,0,1,0,0,0,1,1,1,1,1,1,1,0,1}, // 7
- {1,0,0,0,0,1,1,0,1,0,1,1,1,3,1,1,0,1,0,1,1,1,0,0,1,0,0,0,1,0,0,1}, // 8
- {1,1,1,1,1,1,0,0,1,0,0,0,0,0,1,0,0,1,0,1,3,1,1,0,1,0,1,0,1,0,1,1}, // 9
- {1,0,0,0,0,1,0,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,0,0,1,0,1,0,0,1}, // 10
- {1,0,1,1,0,1,0,1,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,1,1,1,1,0,1,1,0,1}, // 11
- {1,0,0,1,0,0,0,0,0,1,0,1,0,1,1,1,1,0,1,1,1,0,0,0,1,0,0,0,1,0,0,1}, // 12
- {1,1,0,1,1,1,1,1,1,1,0,1,0,1,3,1,0,0,1,3,1,1,1,0,0,0,1,0,1,0,1,1}, // 13
- {1,0,0,1,0,0,3,1,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,1,1,1,1,0,1,0,0,1}, // 14
- {1,0,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,0,0,0,1,1,0,1}, // 15
- {1,0,1,0,0,1,1,0,0,1,0,0,0,1,3,1,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,1}, // 16
- {1,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,0,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1}, // 17
- {1,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,1}, // 18
- {1,0,1,3,0,0,1,1,1,1,1,1,0,0,0,1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,0,1}, // 19
- {1,0,1,1,1,0,1,0,0,0,0,1,0,1,0,1,0,1,1,0,1,3,1,0,0,0,0,0,0,1,0,1}, // 20
- {1,0,1,1,0,0,1,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0,1,0,1,1,1,1,0,0,0,1}, // 21
- {1,0,1,0,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,1,0,1}, // 22
- {1,0,1,0,1,1,0,0,1,0,0,1,0,0,0,1,0,0,0,3,1,1,0,0,1,0,1,1,1,0,0,1}, // 23
- {1,0,1,0,0,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1}, // 24
- {1,0,1,1,0,1,0,0,1,0,0,0,0,1,3,0,1,1,3,1,3,1,1,1,0,1,1,0,1,1,1,1}, // 25
- {1,0,0,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,1,0,0,0,1,0,0,1,1,1,1}, // 26
- {1,1,0,0,0,1,0,0,1,0,0,1,0,0,1,1,0,1,0,1,0,1,0,1,1,1,3,1,1,1,1,1}, // 27
- {1,1,1,1,1,1,0,1,1,1,0,1,1,0,0,0,0,1,0,1,0,0,0,1,1,1,1,1,0,0,0,1}, // 28
- {1,0,0,0,0,0,0,1,3,1,0,0,1,0,1,1,1,1,0,1,1,1,1,1,0,0,0,1,0,1,0,1}, // 29
- {1,0,1,1,1,1,0,1,0,1,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,1,3,1}, // 30
- {1,0,0,1,0,0,0,1,0,1,0,0,1,1,1,1,1,0,1,0,0,0,1,0,1,1,1,1,1,1,1,1}, // 31
- {1,1,0,1,0,1,1,1,0,1,0,1,1,0,0,0,1,3,1,1,1,1,1,0,0,1,3,3,3,3,3,1}, // 32
- {1,0,0,1,0,1,0,0,0,1,0,1,0,0,1,0,1,1,1,0,0,0,1,1,0,0,3,3,3,3,3,1}, // 33
- {1,3,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,3,1,1,1,3,3,3,3,3,1}, // 34
- {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} // 35
- };
-
-
-
-
- ///--------------------------------------------------------------------------------------
- // Main
- ///--------------------------------------------------------------------------------------
-
- void main( void )
- {
- Initialize(kNumberOfMoreMastersCalls);
- Randomize();
-
- if (SWHasSystem7())
- {
- AllowKeyUpEvents(); // Part of SWGameUtils.c
- SetCursor(*GetCursor(watchCursor));
-
- CreateSpriteWorld();
- CreateSprites();
-
- SetCursor(&qd.arrow);
- HideCursor();
-
- SetUpAnimation();
- RunAnimation();
- ShutDown();
-
- RestoreEventMask(); // Call this after AllowKeyUpEvents
- }
- else
- {
- CantRunOnThisMachine();
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // CreateSpriteWorld
- ///--------------------------------------------------------------------------------------
-
- void CreateSpriteWorld( void )
- {
- RgnHandle mBarUpdateRgn;
- Rect windRect;
- OSErr err;
- short row, col;
-
- gWindowP = GetNewCWindow(kWindowResID, NULL, (WindowPtr)-1L);
-
- if (gWindowP != NULL)
- {
- // Center window in screen
- windRect = gWindowP->portRect;
- CenterRect(&windRect, &qd.screenBits.bounds);
- MoveWindow(gWindowP, windRect.left, windRect.top, false);
-
- ShowWindow(gWindowP);
- SetPort(gWindowP);
- mBarUpdateRgn = SWHideMenuBar(gWindowP); // Must be done *after* showing window!
- EraseRgn(mBarUpdateRgn);
- }
- else
- CantFindResource();
-
-
- err = SWEnterSpriteWorld();
- FatalError(err);
-
-
- // Set size of screenRect and offscreenRect
- gScreenRect = gWindowP->portRect;
- OffsetRect(&gScreenRect, -gScreenRect.left, -gScreenRect.top); // Offset to 0,0
-
- gScreenRect.left += kTileWidth/2;
- gScreenRect.right -= kTileWidth/2;
- gOffscreenRect = gScreenRect;
-
- gScreenRect.top += kTileHeight/4;
- gScreenRect.bottom = gScreenRect.bottom/2 - kTileHeight/4; // Set to top half
- gOffscreenRect.top = gOffscreenRect.bottom/2 + kTileHeight/4; // Set to bottom half
- gOffscreenRect.bottom -= kTileHeight/4;
-
-
- // Create the scrolling sprite world
- err = SWCreateSpriteWorldFromWindow(&gSpriteWorldP, (CWindowPtr)gWindowP,
- &gScreenRect, &gOffscreenRect, 0);
- FatalError(err);
-
- // Create windowFrame for the bottom area of the screen that shows the work area
- SetPort(gWindowP);
- err = SWCreateWindowFrame(&gMyWindowFrameP, &gOffscreenRect, 0);
- FatalError(err);
-
- SWLockWindowFrame(gMyWindowFrameP); // Very important!
-
-
- err = SWInitTiling(gSpriteWorldP, kTileHeight, kTileWidth, kMaxNumTiles);
- FatalError(err);
-
- err = SWCreateTileMap(&gTileMapStructP, kTileMapRows, kTileMapCols);
- FatalError(err);
-
- SWInstallTileMap(gSpriteWorldP, gTileMapStructP, 0);
- gTileMap = gTileMapStructP->tileMap;
-
-
- // Load B&W dithered tiles
- if (gSpriteWorldP->pixelDepth == 1)
- {
- err = SWLoadTilesFromPictResource(
- gSpriteWorldP,
- 0, // startTileID
- kMaxNumTiles-1, // endTileID
- 129, // pictResID
- 0, // maskResID
- kNoMask, // maskType
- 1, // horizBorderWidth
- 1); // vertBorderHeight
- }
- else // Load 256 color tiles
- {
- err = SWLoadTilesFromPictResource(
- gSpriteWorldP,
- 0, // startTileID
- kMaxNumTiles-1, // endTileID
- 128, // pictResID
- 0, // maskResID
- kNoMask, // maskType
- 1, // horizBorderWidth
- 1); // vertBorderHeight
- }
- FatalError(err);
-
-
- // Copy maze data into tileMap
- for (row = 0; row < kTileMapRows; row++)
- {
- for (col = 0; col < kTileMapCols; col++)
- {
- gTileMap[row][col] = gMazeData[row][col];
- }
- }
-
-
- // movement boundary = size of tileMap
- SetRect(&gMoveBoundsRect, 0, 0, kTileMapCols * kTileWidth, kTileMapRows * kTileHeight);
- }
-
-
- ///--------------------------------------------------------------------------------------
- // CreateSprites
- ///--------------------------------------------------------------------------------------
-
- void CreateSprites( void )
- {
- SpriteLayerPtr mainSpriteLayerP;
- SpriteLayerPtr ballSpriteLayerP;
- SpriteLayerPtr idleSpriteLayerP;
- SpritePtr spriteP;
- SpritePtr idleSpriteP;
- short spriteNum;
- Point moveDelta;
- OSErr err;
-
-
- // Create the sprite layers
- err = SWCreateSpriteLayer(&mainSpriteLayerP);
- FatalError(err);
- err = SWCreateSpriteLayer(&ballSpriteLayerP);
- FatalError(err);
- err = SWCreateSpriteLayer(&idleSpriteLayerP);
- FatalError(err);
-
-
- // Create the main sprite
- err = SWCreateSpriteFromCicnResource(gSpriteWorldP, &gSimpleSpriteP, NULL,
- 128, 1, kFatMask);
- FatalError(err);
-
- // Set up the main sprite
- SWAddSprite(mainSpriteLayerP, gSimpleSpriteP);
- SWSetSpriteMoveProc(gSimpleSpriteP, KeySpriteMoveProc);
- SWSetSpriteLocation(gSimpleSpriteP, kStartCol * kTileWidth, kStartRow * kTileHeight);
- if (gSpriteWorldP->pixelDepth == 8) // If in 256 colors
- SWSetSpriteDrawProc(gSimpleSpriteP, BlitPixie8BitRectDrawProc);
-
-
-
- // create and set up the idle sprites
- for (spriteNum = 0; spriteNum < kNumIdleSprites; spriteNum++)
- {
- if (spriteNum == 0)
- {
- err = SWCreateSpriteFromCicnResource(gSpriteWorldP, &idleSpriteP, NULL,
- 129, 1, kFatMask);
- FatalError(err);
- spriteP = idleSpriteP;
- }
- else
- { // Clone from first sprite
- err = SWCloneSprite(idleSpriteP, &spriteP, NULL);
- FatalError(err);
- }
-
- SWAddSprite(idleSpriteLayerP, spriteP);
-
- SWSetSpriteLocation(spriteP, (3 + spriteNum) * kTileWidth + kTileWidth/2,
- kTileHeight * 2);
-
- if (gSpriteWorldP->pixelDepth == 8) // If in 256 colors
- SWSetSpriteDrawProc(spriteP, BlitPixie8BitMaskDrawProc);
- }
-
-
- // create and set up the ball sprites
- for (spriteNum = 0; spriteNum < kNumBallSprites; spriteNum++)
- {
- err = SWCloneSprite(idleSpriteP, &spriteP, NULL);
- FatalError(err);
-
- SWAddSprite(ballSpriteLayerP, spriteP);
- SWSetSpriteMoveBounds(spriteP, &gMoveBoundsRect);
- SWSetSpriteMoveProc(spriteP, BallSpriteMoveProc);
-
- SWSetSpriteLocation(spriteP,
- GetRandom(0, gMoveBoundsRect.right),
- GetRandom(0, gMoveBoundsRect.bottom));
-
- do
- {
- moveDelta.h = GetRandom(-kMaxSpriteMoveDelta, kMaxSpriteMoveDelta);
- moveDelta.v = GetRandom(-kMaxSpriteMoveDelta, kMaxSpriteMoveDelta);
- } while (!moveDelta.v && !moveDelta.h);
-
- SWSetSpriteMoveDelta(spriteP, moveDelta.h, moveDelta.v);
-
- if (gSpriteWorldP->pixelDepth == 8) // If in 256 colors
- SWSetSpriteDrawProc(spriteP, BlitPixie8BitMaskDrawProc);
- }
-
-
-
- SWAddSpriteLayer(gSpriteWorldP, mainSpriteLayerP);
- SWAddSpriteLayer(gSpriteWorldP, idleSpriteLayerP);
- SWAddSpriteLayer(gSpriteWorldP, ballSpriteLayerP);
-
- SWLockSpriteWorld(gSpriteWorldP);
- }
-
-
- ///--------------------------------------------------------------------------------------
- // SetUpAnimation
- ///--------------------------------------------------------------------------------------
-
- void SetUpAnimation( void )
- {
- SWSetSpriteWorldMaxFPS(gSpriteWorldP, kMaxFPS);
- SWSetPostDrawCallBack(gSpriteWorldP, MyPostDrawCallBack);
- SWSetScrollingWorldMoveProc(gSpriteWorldP, FollowSpriteMoveProc, gSimpleSpriteP);
- SWSetScrollingWorldMoveBounds(gSpriteWorldP, &gMoveBoundsRect);
-
- SWSetTileChangeProc(gSpriteWorldP, TileChangeProc);
-
- if (gSpriteWorldP->pixelDepth == 8) // If in 256 colors
- {
- SWSetSpriteWorldOffscreenDrawProc(gSpriteWorldP, BlitPixie8BitRectDrawProc);
- SWSetDoubleRectDrawProc(gSpriteWorldP, BlitPixie8BitDoubleRectDrawProc);
- }
- else if (gSpriteWorldP->pixelDepth == 16) // If in thousands of colors
- {
- SWSetSpriteWorldOffscreenDrawProc(gSpriteWorldP, BlitPixieAllBitRectDrawProc);
- SWSetDoubleRectDrawProc(gSpriteWorldP, BlitPixie16BitDoubleRectDrawProc);
- }
-
- ForeColor(blackColor);
- BackColor(whiteColor);
-
- SWDrawTilesInBackground(gSpriteWorldP);
- SWUpdateScrollingSpriteWorld(gSpriteWorldP, true);
- }
-
-
- ///--------------------------------------------------------------------------------------
- // RunAnimation
- ///--------------------------------------------------------------------------------------
-
- void RunAnimation( void )
- {
- FatalError( SWStickyError() ); // Make sure no errors got past us during setup
-
- while (!Button())
- {
- SWProcessScrollingSpriteWorld(gSpriteWorldP);
- FatalError( SWStickyError() ); // Make sure no error occurred during a MoveProc, etc.
- SWAnimateScrollingSpriteWorld(gSpriteWorldP);
-
- if (gSpriteWorldP->frameHasOccurred)
- {
- // Erase color-coded rects from previous frame
- SWFlagScrollingRectAsChanged(gSpriteWorldP, &gSpriteWorldP->visScrollRect);
-
-
- // Copy the work area to the bottom portion of the window
- (*gSpriteWorldP->screenDrawProc)(gSpriteWorldP->workFrameP,
- gMyWindowFrameP,
- &gSpriteWorldP->backRect,
- &gMyWindowFrameP->frameRect);
- }
- }
-
- SWShowMenuBar(gWindowP);
- }
-
-
- ///--------------------------------------------------------------------------------------
- // ShutDown (clean up and dispose of the SpriteWorld)
- ///--------------------------------------------------------------------------------------
-
- void ShutDown( void )
- {
- SWUnlockSpriteWorld(gSpriteWorldP);
- SWDisposeSpriteWorld(&gSpriteWorldP);
- SWExitSpriteWorld();
-
- FlushEvents(everyEvent, 0);
- ShowCursor();
- }
-
-
- ///--------------------------------------------------------------------------------------
- // TileChangeProc
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC void TileChangeProc(
- SpriteWorldPtr spriteWorldP)
- {
- short curImage;
- static short wallDelay = 0, diamondDelay = 0;
- static short oldTicks = 0;
- short ticksPassed, ticks;
-
- // Initialize oldTicks the first time this function is called
- if (oldTicks == 0)
- oldTicks = TickCount();
-
- ticks = TickCount();
- ticksPassed = ticks - oldTicks; // Number of ticks passed since last call
- oldTicks = ticks;
-
-
- // kDiamondTile
- diamondDelay += ticksPassed;
- if (diamondDelay >= kDiamondFrameRate)
- {
- curImage = spriteWorldP->curTileImage[kDiamondTile];
- if (curImage < kLastDiamondTile)
- curImage++;
- else
- curImage = kDiamondTile;
-
- SWChangeTileImage(spriteWorldP, kDiamondTile, curImage);
- diamondDelay = 0;
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // KeySpriteMoveProc
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC void KeySpriteMoveProc(SpritePtr srcSpriteP)
- {
- short row, col;
- short rowDelta, colDelta;
- short tile;
-
- UpdateKeys(); // Put the latest key values in the keys structure
-
-
- row = srcSpriteP->destFrameRect.top / kTileHeight;
- col = srcSpriteP->destFrameRect.left / kTileWidth;
-
- if (row * kTileHeight == srcSpriteP->destFrameRect.top &&
- col * kTileWidth == srcSpriteP->destFrameRect.left)
- {
- // Set tile below sprite to blank
- if (gTileMap[row][col] != kBlackTile)
- SWDrawTile(gSpriteWorldP, 0, row, col, kBlackTile);
-
- rowDelta = 0;
- colDelta = 0;
-
- if (keys.left)
- colDelta = -1;
- else if (keys.right)
- colDelta = 1;
- else if (keys.up)
- rowDelta = -1;
- else if (keys.down)
- rowDelta = 1;
-
-
- tile = gTileMap[row + rowDelta][col + colDelta];
-
- if (tile != kWallTile)
- {
- srcSpriteP->vertMoveDelta = rowDelta * kSpriteMoveDelta;
- srcSpriteP->horizMoveDelta = colDelta * kSpriteMoveDelta;
- }
- else
- {
- srcSpriteP->vertMoveDelta = 0;
- srcSpriteP->horizMoveDelta = 0;
- }
- }
-
- SWOffsetSprite(srcSpriteP, srcSpriteP->horizMoveDelta, srcSpriteP->vertMoveDelta);
- }
-
-
- ///--------------------------------------------------------------------------------------
- // BallSpriteMoveProc - moveProc for all the bouncing balls
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC void BallSpriteMoveProc(SpritePtr ballSpriteP)
- {
- SWOffsetSprite(ballSpriteP, ballSpriteP->horizMoveDelta, ballSpriteP->vertMoveDelta);
- SWBounceSprite(ballSpriteP);
- }
-
-
- ///--------------------------------------------------------------------------------------
- // FollowSpriteMoveProc - our scrolling WorldMoveProc
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC void FollowSpriteMoveProc(
- SpriteWorldPtr spriteWorldP,
- SpritePtr followSpriteP)
- {
- Rect* visScrollRectP = &spriteWorldP->visScrollRect;
- short hMargin = (spriteWorldP->windRect.right - spriteWorldP->windRect.left)/3;
- short vMargin = (spriteWorldP->windRect.bottom - spriteWorldP->windRect.top)/3;
-
-
- // Move horizontally
- if (followSpriteP->destFrameRect.right > visScrollRectP->right - hMargin)
- {
- spriteWorldP->horizScrollDelta = followSpriteP->destFrameRect.right -
- (visScrollRectP->right - hMargin);
- }
- else if (followSpriteP->destFrameRect.left < visScrollRectP->left + hMargin)
- {
- spriteWorldP->horizScrollDelta = followSpriteP->destFrameRect.left -
- (visScrollRectP->left + hMargin);
- }
- else
- spriteWorldP->horizScrollDelta = 0;
-
-
- // Move vertically
- if (followSpriteP->destFrameRect.bottom > visScrollRectP->bottom - vMargin)
- {
- spriteWorldP->vertScrollDelta = followSpriteP->destFrameRect.bottom -
- (visScrollRectP->bottom - vMargin);
- }
- else if (followSpriteP->destFrameRect.top < visScrollRectP->top + vMargin)
- {
- spriteWorldP->vertScrollDelta = followSpriteP->destFrameRect.top -
- (visScrollRectP->top + vMargin);
- }
- else
- spriteWorldP->vertScrollDelta = 0;
- }
-
-
- ///--------------------------------------------------------------------------------------
- // UpdateKeys (Put the latest key values in the keys structure)
- ///--------------------------------------------------------------------------------------
-
- void UpdateKeys( void )
- {
- EventRecord event;
- short theKey, theChar;
- Boolean isDown;
-
- while ( GetOSEvent( (keyUpMask | keyDownMask), &event ) )
- {
- theKey = (event.message & keyCodeMask) >> 8;
- theChar = (event.message & charCodeMask);
- isDown = (event.what != keyUp);
-
- if ( (theKey == kLeftArrowKey) || (theKey == kLeftKeyPad) )
- keys.left = isDown;
- else if ( (theKey == kRightArrowKey) || (theKey == kRightKeyPad) )
- keys.right = isDown;
- else if ( (theKey == kDownArrowKey) || (theKey == kDownKeyPad) )
- keys.down = isDown;
- else if ( (theKey == kUpArrowKey) || (theKey == kUpKeyPad) )
- keys.up = isDown;
- else if (theChar >= '0' && theChar <= '5' && theKey < 0x52)
- {
- gPenSize = theChar - '0'; // Change thickness of rects
- }
- else if (theKey == kEscKey) // Go back to beginning of maze
- {
- SWMoveSprite(gSimpleSpriteP, kStartCol * kTileWidth, kStartRow * kTileHeight);
- SWMoveVisScrollRect(gSpriteWorldP, 0, 0);
- }
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // MyPostDrawCallBack - draws outline rects in work area to show where the "pieces"
- // have been copied from in the offscreen area.
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC void MyPostDrawCallBack(SpriteWorldPtr spriteWorldP)
- {
- FramePtr srcFrameP = spriteWorldP->workFrameP;
- Rect visRect = spriteWorldP->windowFrameP->frameRect;
- Rect srcRect = spriteWorldP->offscreenScrollRect;
- Rect tempSrcRect;
-
- // Size of area that was clipped in source rect
- short topClip=0, rightClip=0, bottomClip=0, leftClip=0;
-
-
- // Clip the source rect, and save what we clipped for wrapping later //
-
- // clip off the top
- if (srcRect.top < srcFrameP->frameRect.top)
- {
- topClip = srcFrameP->frameRect.top - srcRect.top;
- srcRect.top += topClip;
- }
-
- // clip off the bottom
- if (srcRect.bottom > srcFrameP->frameRect.bottom)
- {
- bottomClip = srcRect.bottom - srcFrameP->frameRect.bottom;
- srcRect.bottom -= bottomClip;
- }
-
- // clip off the left
- if (srcRect.left < srcFrameP->frameRect.left)
- {
- leftClip = srcFrameP->frameRect.left - srcRect.left;
- srcRect.left += leftClip;
- }
-
- // clip off the right
- if (srcRect.right > srcFrameP->frameRect.right)
- {
- rightClip = srcRect.right - srcFrameP->frameRect.right;
- srcRect.right -= rightClip;
- }
-
-
- SWSetPortToWorkArea(spriteWorldP);
- PenSize(gPenSize, gPenSize); // Width of rectangles
-
-
- // Do the wrapping and drawing //
-
- // Draw left side, starting at top and going down //
-
- if (leftClip)
- {
- if (topClip) // Draw top-left piece //
- {
- ForeColor(blackColor);
-
- // Wrap source rect to lower-right corner //
- tempSrcRect.bottom = srcFrameP->frameRect.bottom;
- tempSrcRect.right = srcFrameP->frameRect.right;
- tempSrcRect.top = srcFrameP->frameRect.bottom - topClip;
- tempSrcRect.left = srcFrameP->frameRect.right - leftClip;
-
- FrameRect(&tempSrcRect);
- }
-
-
- // Draw left middle section //
-
- ForeColor(redColor);
-
- // Wrap source rect to right side //
- tempSrcRect.top = srcRect.top; // Copy clipped source rect
- tempSrcRect.bottom = srcRect.bottom;
- tempSrcRect.right = srcFrameP->frameRect.right;
- tempSrcRect.left = srcFrameP->frameRect.right - leftClip;
-
- FrameRect(&tempSrcRect);
-
-
- if (bottomClip) // Draw bottom-left piece //
- {
- ForeColor(blackColor);
-
- // Wrap source rect to upper-right corner //
- tempSrcRect.top = srcFrameP->frameRect.top;
- tempSrcRect.right = srcFrameP->frameRect.right;
- tempSrcRect.bottom = srcFrameP->frameRect.top + bottomClip;
- tempSrcRect.left = srcFrameP->frameRect.right - leftClip;
-
- FrameRect(&tempSrcRect);
- }
- }
-
-
- // Draw middle section, starting at top and going down //
-
- if (topClip) // Draw top middle section //
- {
- ForeColor(cyanColor);
-
- // Wrap source rect to lower middle section //
- tempSrcRect.right = srcRect.right; // Copy clipped source rect
- tempSrcRect.left = srcRect.left;
- tempSrcRect.bottom = srcFrameP->frameRect.bottom;
- tempSrcRect.top = srcFrameP->frameRect.bottom - topClip;
-
- FrameRect(&tempSrcRect);
- }
-
-
- // Draw main middle section //
- ForeColor(blueColor);
-
- tempSrcRect = srcRect;
- FrameRect(&tempSrcRect);
-
-
- if (bottomClip) // Draw bottom middle section //
- {
- ForeColor(cyanColor);
-
- // Wrap source rect to upper middle section //
- tempSrcRect.right = srcRect.right; // Copy clipped source rect
- tempSrcRect.left = srcRect.left;
- tempSrcRect.top = srcFrameP->frameRect.top;
- tempSrcRect.bottom = srcFrameP->frameRect.top + bottomClip;
-
- FrameRect(&tempSrcRect);
- }
-
-
-
- // Draw right section, starting at top and going down //
-
- if (rightClip)
- {
- if (topClip) // Draw top-right piece //
- {
- ForeColor(blackColor);
-
- // Wrap source rect to lower-left corner //
- tempSrcRect.bottom = srcFrameP->frameRect.bottom;
- tempSrcRect.left = srcFrameP->frameRect.left;
- tempSrcRect.right = srcFrameP->frameRect.left + rightClip;
- tempSrcRect.top = srcFrameP->frameRect.bottom - topClip;
-
- FrameRect(&tempSrcRect);
- }
-
-
- // Draw right middle section //
-
- ForeColor(redColor);
-
- // Wrap source rect to left side //
- tempSrcRect.top = srcRect.top; // Copy clipped source rect
- tempSrcRect.bottom = srcRect.bottom;
- tempSrcRect.left = srcFrameP->frameRect.left;
- tempSrcRect.right = srcFrameP->frameRect.left + rightClip;
-
- FrameRect(&tempSrcRect);
-
-
-
- if (bottomClip) // Draw bottom-right piece //
- {
- ForeColor(blackColor);
-
- // Wrap source rect to upper-left corner //
- tempSrcRect.top = srcFrameP->frameRect.top;
- tempSrcRect.left = srcFrameP->frameRect.left;
- tempSrcRect.bottom = srcFrameP->frameRect.top + bottomClip;
- tempSrcRect.right = srcFrameP->frameRect.left + rightClip;
-
- FrameRect(&tempSrcRect);
- }
- }
-
- ForeColor(blackColor); // Set back to standard when done
- }
-
-